home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 722 / 722.xpi / chrome / noscript.jar / content / noscript / Policy.js < prev    next >
Text File  |  2010-02-12  |  27KB  |  649 lines

  1. const CP_OK = 1;
  2. const CP_NOP = function() { return CP_OK };
  3. const CP_FRAMECHECK = 2;
  4. const CP_SHOULDPROCESS = 4;
  5. const CP_EXTERNAL = 0;
  6.  
  7. const PolicyState = {
  8.   _debug: false,
  9.   _uris: [],
  10.   URI: null,
  11.   hints: null,
  12.   
  13.   checking: [],
  14.   addCheck: function(url) {
  15.     if (this.checking.indexOf(url) === -1)
  16.       this.checking.push(url);
  17.   },
  18.   removeCheck: function(url) {
  19.     var idx = this.checking.indexOf(url);
  20.     if (idx > -1) this.checking.splice(idx, 1);
  21.   },
  22.   isChecking: function(url) {
  23.     return this.checking.indexOf(url) > -1;
  24.   },
  25.   
  26.   attach: function(channel) {
  27.     if (this.URI === channel.URI) {
  28.       if (this._debug) this.push(this.URI);
  29.       IOUtil.attachToChannel(channel, "noscript.policyHints", this.hints);
  30.       this.reset();
  31.     }
  32.   },
  33.   extract: function(channel, detach) {
  34.     var res = IOUtil.extractFromChannel(channel, "noscript.policyHints", !detach);
  35.     if (detach && res !== null && this._debug) {
  36.       var idx = this._uris.indexOf(this.URI);
  37.       if (idx > -1) this._uris.splice(idx, 1);
  38.     }
  39.     return res;
  40.   },
  41.   detach: function(channel) {
  42.     return this.extract(channel, true);
  43.   },
  44.   reset: function() {
  45.     this.URI = this.hints = null;
  46.   },
  47.   cancel: function(hints) {
  48.     this.reset();
  49.     hints._psCancelled = true;
  50.   },
  51.   save: function(uri, hints) {
  52.     if ("_psCancelled" in hints) return false;
  53.     this.URI = uri;
  54.     this.hints = new PolicyHints(hints);
  55.     return true;
  56.   },
  57.   
  58.   toString: function() {
  59.     return this._uris.map(function(u) { return u.spec; }).join(", ");
  60.   }
  61. }
  62.  
  63. function PolicyHints(hints) {
  64.   Array.prototype.push.apply(this, Array.slice(hints, 0));
  65. }
  66.  
  67. PolicyHints.prototype = (function() {
  68.   var proto = new Array();
  69.   ["contentType", "contentLocation", "requestOrigin", "context", "mimeType", "extra"].forEach(function(p, i) {
  70.     this.__defineGetter__(p, function() { return this[i] });
  71.     this.__defineSetter__(p, function(v) { return this[i] = v });
  72.    }, proto);
  73.    proto.toArray = function() {
  74.       return Array.slice(this, 0)
  75.    };
  76.    return proto;
  77. })();
  78.  
  79. const NOPContentPolicy = {
  80.   shouldLoad: CP_NOP,
  81.   shouldProcess: CP_NOP
  82. };
  83.  
  84.   
  85. // nsIContentPolicy interface
  86. // we use numeric constants for performance sake: 
  87. // TYPE_OTHER = 1
  88. // TYPE_SCRIPT = 2
  89. // TYPE_IMAGE = 3
  90. // TYPE_STYLESHEET = 4
  91. // TYPE_OBJECT = 5
  92. // TYPE_DOCUMENT = 6
  93. // TYPE_SUBDOCUMENT = 7
  94. // TYPE_REFRESH = 8
  95. // TYPE_XBL = 9
  96. // TYPE_PING = 10
  97. // TYPE_XMLHTTPREQUEST = 11
  98. // TYPE_OBJECT_SUBREQUEST = 12
  99. // REJECT_SERVER = -3
  100. // ACCEPT = 1
  101.  
  102.  
  103. const MainContentPolicy = {
  104.   shouldLoad: function(aContentType, aContentLocation, aRequestOrigin, aContext, aMimeTypeGuess, aInternalCall) {
  105.     if (!aInternalCall) PolicyState.addCheck(aContentLocation);
  106.    
  107.     try {
  108.  
  109.       var originURL, locationURL, originSite, locationSite, scheme,
  110.           forbid, isScript, isJava, isFlash, isSilverlight,
  111.           isLegacyFrame, blockThisFrame, contentDocument,
  112.           logIntercept, logBlock,
  113.           unwrappedLocation, mimeKey;
  114.       
  115.       logIntercept = this.consoleDump;
  116.       if(logIntercept) {
  117.         logBlock = logIntercept & LOG_CONTENT_BLOCK;
  118.         logIntercept = logIntercept & LOG_CONTENT_INTERCEPT;
  119.       } else logBlock = false;
  120.     
  121.       if (aContentType == 1 && !this.POLICY_OBJSUB) { // compatibility for type OTHER
  122.         if (aContext instanceof CI.nsIDOMHTMLDocument) {
  123.           aContentType = arguments.callee.caller ? 11 : 9;
  124.         } else if ((aContext instanceof CI.nsIDOMHTMLElement)) {
  125.           if ((aContext instanceof CI.nsIDOMHTMLEmbedElement || aContext instanceof CI.nsIDOMHTMLObjectElement)) {
  126.             aContentType = 12;
  127.           } else if (aContext.getAttribute("ping")) {
  128.             aContentType = 10;
  129.           }
  130.         }
  131.         arguments[0] = aContentType;
  132.       }
  133.       
  134.       unwrappedLocation = IOUtil.unwrapURL(aContentLocation);
  135.       scheme = unwrappedLocation.scheme;
  136.       
  137.       var isHTTP = /^https?$/.test(scheme);
  138.       
  139.       if (isHTTP) {
  140.         
  141.         HTTPS.forceURI(unwrappedLocation, null, aContext);
  142.         
  143.         if (aRequestOrigin && !aInternalCall) {
  144.           
  145.           if (aContentType != 3) // images are a bitch if cached!
  146.             XOriginCache.store(aRequestOrigin, arguments.xOriginKey = unwrappedLocation);
  147.           
  148.           switch(aContentType) {
  149.             // case 2: case 4: // scripts stall if blocked later
  150.             case 1: case 12: // we may have no chance to check later for unknown and sub-plugin requests
  151.               if (ABE.checkPolicy(aRequestOrigin, unwrappedLocation))
  152.                 return this.reject("ABE-denied inclusion", arguments); 
  153.           }
  154.         }
  155.         
  156.         if (logIntercept && this.cpConsoleFilter.indexOf(aContentType) > -1) {
  157.           this.cpDump("processing", aContentType, aContentLocation, aRequestOrigin, aContext, aMimeTypeGuess, aInternalCall);
  158.           if (this.consoleDump & LOG_CONTENT_CALL)
  159.              this.dump(new Error().stack);
  160.         }
  161.         
  162.       }
  163.       
  164.       switch (aContentType) {
  165.         case 9: // XBL - warning, in 1.8.x could also be XMLHttpRequest...
  166.           return this.forbidXBL && 
  167.             this.forbiddenXMLRequest(aRequestOrigin, aContentLocation, aContext, this.forbiddenXBLContext) 
  168.             ? this.reject("XBL", arguments) : CP_OK;
  169.         
  170.         case 11: // in Firefox 3 we check for cross-site XHR
  171.           return this.forbidXHR && 
  172.             this.forbiddenXMLRequest(aRequestOrigin, aContentLocation, aContext, this.forbiddenXHRContext) 
  173.              ? this.reject("XHR", arguments) : CP_OK;
  174.         
  175.         case 10: // TYPE_PING
  176.           if (this.jsEnabled || !this.getPref("noping", true) || 
  177.               aRequestOrigin && this.isJSEnabled(this.getSite(aRequestOrigin.spec))
  178.             )
  179.             return CP_OK;
  180.             
  181.           return this.reject("Ping", arguments);
  182.             
  183.         case 2:
  184.           if (this.forbidChromeScripts && this.checkForbiddenChrome(aContentLocation, aRequestOrigin)) {
  185.             return this.reject("Chrome Access", arguments);
  186.           }
  187.           if (this.forbidJarDocuments && aRequestOrigin && this.checkJarDocument(aContentLocation, aContext, aRequestOrigin)) {
  188.             return this.reject("Cross-site jar-embedded script", arguments);
  189.           }
  190.           forbid = isScript = true;
  191.           break;
  192.         case 3: // IMAGES
  193.           if (this.blockNSWB && 
  194.               !(this.jsEnabled || aRequestOrigin &&
  195.                 ((originSite = this.getSite(aRequestOrigin.spec)) == this.getSite(aContentLocation.spec)
  196.                     || this.isJSEnabled(originSite)))
  197.                 && aContext instanceof CI.nsIDOMHTMLImageElement) {
  198.             try {
  199.               for (var parent = aContext; (parent = parent.parentNode);) {
  200.                 if (parent.nodeName.toUpperCase() == "NOSCRIPT")
  201.                   return this.reject("Tracking Image", arguments);
  202.               }
  203.             } catch(e) {
  204.               this.dump(e)
  205.             }
  206.           }
  207.   
  208.           PolicyState.cancel(arguments);
  209.           return CP_OK;
  210.         
  211.         case 4: // STYLESHEETS
  212.           if (PolicyUtil.isXSL(aContext) && /\/x[ms]l/.test(aMimeTypeGuess) &&
  213.               !/chrome|resource/.test(aContentLocation.scheme) &&
  214.                 this.getPref("forbidXSLT", true)) {
  215.             forbid = isScript = true; // we treat XSLT like scripts
  216.             break;
  217.           }
  218.           
  219.           if (this.forbidJarDocuments && aRequestOrigin && this.checkJarDocument(aContentLocation, aContext, aRequestOrigin)) {
  220.             return this.reject("Cross-site jar-embedded stylesheet", arguments);
  221.           }
  222.           
  223.           return CP_OK;
  224.         
  225.         case 14: // fonts
  226.           forbid = this.forbidFonts;
  227.           if (!forbid) return CP_OK;
  228.           mimeKey = "Font";
  229.           break;
  230.         
  231.         case 5: // embeds
  232.         case 15: // media
  233.           if (aContentLocation && aRequestOrigin && 
  234.               (locationURL = aContentLocation.spec) == (originURL = aRequestOrigin.spec) &&
  235.               aMimeTypeGuess) {
  236.               
  237.             if ((aContext instanceof CI.nsIDOMHTMLEmbedElement) &&
  238.               this.isAllowedObject(locationURL, aMimeTypeGuess)
  239.               ) {
  240.               if (logIntercept) this.dump("Plugin document " + locationURL);
  241.               return CP_OK; // plugin document, we'll handle it in our webprogress listener
  242.             }
  243.             
  244.             if (!(aContext.getAttribute("data") || aContext.getAttribute("codebase") || aContext.getAttribute("archive") || aContext.getAttribute("src")
  245.                   || aContext.firstChild) && aMimeTypeGuess == "application/x-shockwave-flash") {
  246.               if (logIntercept) this.dump("Early Flash object manipulation with no source set yet.");
  247.               if (this.anyAllowedObject(this.getSite(locationURL), aMimeTypeGuess))
  248.                 return CP_OK;
  249.  
  250.               this.setExpando(aContext, "requiresReload", true);
  251.             }
  252.           }
  253.           
  254.           if (this.checkJarDocument(aContentLocation, aContext)) 
  255.             return this.reject("Plugin content from JAR", arguments);
  256.           
  257.           
  258.           if (aContentType == 15) {
  259.               if (aRequestOrigin && !this.isJSEnabled(this.getSite(aRequestOrigin.spec))) {
  260.               // let's wire poor man's video/audio toggles if JS is disabled and therefore controls are not available
  261.               this.delayExec(function() {
  262.                 aContext.addEventListener("click", function(ev) {
  263.                   var media = ev.currentTarget;
  264.                   if (media.paused) media.play();
  265.                   else media.pause();
  266.                 }, true);
  267.               }, 0);
  268.             } 
  269.             
  270.             forbid = this.forbidMedia;
  271.             
  272.           }
  273.           
  274.           if (aMimeTypeGuess) // otherwise let's treat it as an iframe
  275.             break;
  276.           
  277.          
  278.           
  279.         case 7:
  280.           locationURL = aContentLocation.spec;
  281.           originURL = aRequestOrigin && aRequestOrigin.spec;
  282.           if (locationURL == "about:blank" || /^chrome:/.test(locationURL)
  283.             || !originURL && (aContext instanceof CI.nsIDOMXULElement)  // custom browser like in Stumbleupon discovery window
  284.           ) return CP_OK;
  285.           
  286.           if (!aMimeTypeGuess) {
  287.             aMimeTypeGuess = this.guessMime(aContentLocation);
  288.             if (logIntercept)
  289.               this.dump("Guessed MIME '" + aMimeTypeGuess + "' for location " + locationURL);
  290.           }
  291.           
  292.           if (aContentType == 15) {
  293.             if (!aMimeTypeGuess) try {
  294.               aMimeTypeGuess = aContext.tagName.toLowerCase() + "/ogg";
  295.             } catch (e) {}
  296.             
  297.             if (!forbid) return CP_OK;
  298.             
  299.             break; // we just need to guess the Mime for video/audio
  300.           }
  301.           
  302.           isLegacyFrame = aContext instanceof CI.nsIDOMHTMLFrameElement;
  303.      
  304.           if (isLegacyFrame
  305.               ? this.forbidFrames || // we shouldn't allow framesets nested inside iframes, because they're just as bad
  306.                                      this.forbidIFrames &&
  307.                                      (aContext.ownerDocument.defaultView.frameElement instanceof CI.nsIDOMHTMLIFrameElement) &&
  308.                                      this.getPref("forbidMixedFrames", true)
  309.               : this.forbidIFrames || // we use iframes to make placeholders for blocked legacy frames...
  310.                                      this.forbidFrames &&
  311.                                      this.isLegacyFrameReplacement(aContext)
  312.              ) {
  313.               try {
  314.                 contentDocument = aContext.contentDocument;
  315.               } catch(e) {}
  316.            
  317.               blockThisFrame = (aInternalCall === CP_FRAMECHECK) && !(
  318.                       this.knownFrames.isKnown(locationURL, originSite = this.getSite(originURL)) ||
  319.                     /^(?:chrome|resource|wyciwyg):/.test(locationURL) ||
  320.                     locationURL == this._silverlightInstalledHack ||
  321.                     locationURL == this.compatGNotes ||
  322.                     (
  323.                       originURL
  324.                         ? (/^chrome:/.test(originURL) ||
  325.                            /^(?:data|javascript):/.test(locationURL) &&
  326.                             (contentDocument && (originURL == contentDocument.URL
  327.                                                   || /^(?:data:|javascript:|about:blank$)/.test(contentDocument.URL)
  328.                             ) || this.isFirebugJSURL(locationURL)
  329.                            )
  330.                           )
  331.                         : contentDocument && 
  332.                           this.getSite(contentDocument.URL) == (locationSite = this.getSite(locationURL))
  333.                      )
  334.                 ) && this.forbiddenIFrameContext(originURL || (originURL = aContext.ownerDocument.URL), locationURL);
  335.           }
  336.           
  337.         case 6:
  338.   
  339.           if (this.checkJarDocument(aContentLocation, aContext)) 
  340.             return this.reject("JAR Document", arguments);
  341.           
  342.          
  343.           
  344.           if (aRequestOrigin && aRequestOrigin != aContentLocation) {
  345.             
  346.             if (this.safeToplevel && (aContext instanceof CI.nsIDOMChromeWindow) &&
  347.                 aContext.isNewToplevel &&
  348.                 !(/^(?:chrome|resource|file)$/.test(scheme) ||
  349.                   this.isSafeJSURL(aContentLocation.spec))
  350.                   ) {
  351.               return this.reject("Top Level Window Loading", arguments);
  352.             }
  353.          
  354.             if (isHTTP) {
  355.               
  356.               // external?
  357.               if (aRequestOrigin.schemeIs("chrome") && aContext && aContext.ownerDocument &&
  358.                 aContext.ownerDocument.defaultView.isNewToplevel){
  359.                 this.requestWatchdog.externalLoad = aContentLocation.spec;
  360.               }
  361.               
  362.             } else if(/^(?:data|javascript)$/.test(scheme)) {
  363.               //data: and javascript: URLs
  364.               locationURL = locationURL || aContentLocation.spec;
  365.               originSite = this.getSite(originURL = originURL || aRequestOrigin.spec);
  366.               if (this.forbiddenJSDataDoc(locationURL, originSite, aContext)) {
  367.                 return this.reject("JavaScript/Data URL", arguments);
  368.               }
  369.             } else if(scheme != aRequestOrigin.scheme && 
  370.                 scheme != "chrome" && // faster path for common case
  371.                 this.isExternalScheme(scheme)) {
  372.               // work-around for bugs 389106 & 389580, escape external protocols
  373.               if (aContentType != 6 && !aInternalCall && 
  374.                   this.getPref("forbidExtProtSubdocs", true) && 
  375.                   !this.isJSEnabled(originSite = this.getSite(originURL = originURL || aRequestOrigin.spec)) &&
  376.                   (!aContext.contentDocument || aContext.contentDocument.URL != originURL)
  377.                   ) {
  378.                 return this.reject("External Protocol Subdocument", arguments);
  379.               }
  380.               if (!this.normalizeExternalURI(aContentLocation)) {
  381.                 return this.reject("Invalid External URL", arguments);
  382.               }
  383.             } else if(aContentType == 6 && scheme == "chrome" &&
  384.               this.getPref("lockPrivilegedUI", false) && // block DOMI && Error Console
  385.               /^(?:javascript:|chrome:\/\/(?:global\/content\/console|inspector\/content\/inspector|venkman\/content\/venkman)\.xul)$/
  386.                 .test(locationURL)) {
  387.               return this.reject("Locked Privileged UI", arguments);
  388.             }
  389.           }
  390.           
  391.           if (!(this.forbidSomeContent || this.alwaysBlockUntrustedContent) ||
  392.                 !blockThisFrame && (
  393.                   !aMimeTypeGuess 
  394.                   || aMimeTypeGuess.substring(0, 5) == "text/"
  395.                   || aMimeTypeGuess == "application/xml" 
  396.                   || aMimeTypeGuess == "application/xhtml+xml"
  397.                   || aMimeTypeGuess.substring(0, 6) == "image/"
  398.                   || !(this.isMediaType(aMimeTypeGuess) || this.pluginForMime(aMimeTypeGuess))
  399.                 )
  400.             ) {
  401.             
  402.             if (aContext instanceof CI.nsIDOMElement) {
  403.               // this is alternate to what we do in countObject, since we can't get there
  404.               // this.delayExec(this.opaqueIfNeeded, 0, aContext); // TODO uncomment
  405.             }
  406.             
  407.             if (logBlock)
  408.               this.dump("Document OK: " + aMimeTypeGuess + "@" + (locationURL || aContentLocation.spec) + 
  409.                 " --- PGFM: " + this.pluginForMime(aMimeTypeGuess));
  410.             
  411.             if (aContentLocation.schemeIs("about") && /^about:(net|cert)error?/.test(aContentLocation.spec)) {
  412.               ns.handleErrorPage(aContext, aContentLocation);
  413.             }
  414.             
  415.             return CP_OK;
  416.           }
  417.           break;
  418.         
  419.         case 12:
  420.           // Silverlight mindless activation scheme :(
  421.           if (!this.forbidSilverlight 
  422.               || !this.getExpando(aContext, "silverlight") || this.getExpando(aContext, "allowed"))
  423.             return CP_OK;
  424.   
  425.           aMimeTypeGuess = "application/x-silverlight";
  426.           break;
  427.         default:
  428.           return CP_OK;
  429.       }
  430.       
  431.   
  432.       locationURL = locationURL || aContentLocation.spec;
  433.       locationSite = locationSite || this.getSite(locationURL);
  434.       
  435.       var untrusted = untrusted || this.isUntrusted(locationSite);
  436.       
  437.       if(logBlock)
  438.         this.dump("[CP PASS 2] " + aMimeTypeGuess + "*" + locationURL + ", " + aContentType + ", " + aInternalCall);
  439.   
  440.       if (isScript) {
  441.         
  442.         originSite = originSite || aRequestOrigin && this.getSite(aRequestOrigin.spec);
  443.         
  444.         // we must guess the right context here, see https://bugzilla.mozilla.org/show_bug.cgi?id=464754
  445.         
  446.         aContext = aContext && aContext.ownerDocument || aContext; // this way we always have a document
  447.         
  448.         if (aContentType == 2) { // "real" JavaScript include
  449.         
  450.           // plugin instantiation hacks
  451.           if (this.contentBlocker && originSite && /^(?:https?|file):/.test(originSite)) {
  452.             this.applyPluginPatches(aContext);
  453.           }
  454.                   
  455.           if (originSite && locationSite == originSite) return CP_OK;
  456.         } else isScript = false;
  457.         
  458.         if (aContext) // XSLT comes with no context sometimes...
  459.           this.getExpando(aContext.defaultView.top.document, "codeSites", []).push(locationSite);
  460.         
  461.         
  462.         forbid = !this.isJSEnabled(locationSite);
  463.         if (forbid && this.ignorePorts && /:\d+$/.test(locationSite)) {
  464.           forbid = !this.isJSEnabled(locationSite.replace(/:\d+$/, ''));
  465.         }
  466.   
  467.         if ((untrusted || forbid) && aContentLocation.scheme != "data") {
  468.           if (isScript) ScriptSurrogate.apply(aContext, locationURL);
  469.           return this.reject(isScript ? "Script" : "XSLT", arguments);
  470.         } else {
  471.           return CP_OK;
  472.         }
  473.       }
  474.   
  475.       mimeKey = mimeKey || aMimeTypeGuess || "application/x-unknown";
  476.       
  477.       if (!(forbid || locationSite == "chrome:")) {
  478.         
  479.         forbid = blockThisFrame || untrusted && this.alwaysBlockUntrustedContent;
  480.         if (!forbid && this.forbidSomeContent) {
  481.           if (aMimeTypeGuess) {
  482.            
  483.             forbid = 
  484.               (
  485.                 (isFlash = /^application\/(?:x-shockwave-flash|futuresplash)/i.test(aMimeTypeGuess)) ||
  486.                 (isJava = /^application\/x-java\b/i.test(aMimeTypeGuess)) || 
  487.                 (isSilverlight = /^application\/x-silverlight\b/i.test(aMimeTypeGuess)) 
  488.               ) &&
  489.               isFlash && this.forbidFlash || 
  490.               isJava && this.forbidJava || 
  491.               isSilverlight && this.forbidSilverlight;
  492.                         
  493.             // see http://heasman.blogspot.com/2008/03/defeating-same-origin-policy-part-i.html
  494.             if (isJava && /(?:[^\/\w\.\$\:]|^\s*\/\/)/.test(aContext.getAttribute("code") || "")) {
  495.               return this.reject("Illegal Java code attribute " + aContext.getAttribute("code"), arguments);
  496.             }
  497.             
  498.             if (isFlash && aInternalCall === CP_SHOULDPROCESS) this.tagWindowlessObject(aContext);
  499.             
  500.             if (forbid) {
  501.               if (isSilverlight) {
  502.                 if (logIntercept) this.dump("Silverlight " + aContentLocation.spec + " " + typeof(aContext) + " " + aContentType + ", " + aInternalCall);
  503.                
  504.                 
  505.                 forbid = aContentType == 12 || !this.POLICY_OBJSUB;
  506.                 this.setExpando(aContext, "silverlight", aContentType != 12);
  507.                 if (!forbid) return CP_OK;
  508.                 
  509.                 locationURL = this.resolveSilverlightURL(aRequestOrigin, aContext);
  510.                 locationSite = this.getSite(locationURL);
  511.                 originURL = aRequestOrigin && aRequestOrigin.spec;
  512.                 if (!this.POLICY_OBJSUB)  forbid = locationURL != originURL;
  513.                 
  514.                 if(!forbid || this.isAllowedObject(locationURL, mimeKey, locationSite) ||
  515.                    this.isAllowedObjectById(aContext.id, locationURL, originURL, mimeKey, locationSite)) {
  516.                   if (logIntercept && forbid) this.dump("Silverlight " + locationURL + " is whitelisted, ALLOW");
  517.                   return CP_OK;
  518.                 }
  519.               } else if (isFlash) {
  520.                 locationURL = this.addFlashVars(locationURL, aContext);
  521.               }
  522.             } else if (!(this.allowedMimeRegExp && this.allowedMimeRegExp.test(aMimeTypeGuess))) {
  523.               forbid = this.forbidPlugins && !(isJava || isFlash || isSilverlight);
  524.               if (forbid) {
  525.                 locationURL = this.addObjectParams(locationURL, aContext);
  526.               }
  527.             }
  528.           }
  529.         }
  530.       }
  531.   
  532.       if(forbid && !this.contentBlocker) {
  533.         
  534.         originURL = originURL || (aRequestOrigin && aRequestOrigin.spec);
  535.         originSite = originSite || this.getSite(originURL);
  536.       
  537.         var originOK = originSite 
  538.           ? this.isJSEnabled(originSite) 
  539.           : /^(?:javascript|data):/.test(originURL); // if we've got such an origin, parent should be trusted
  540.         
  541.         var locationOK = locationSite 
  542.               ? this.isJSEnabled(locationSite) 
  543.               : // use origin for javascript: or data:
  544.                 /^(?:javascript|data):/.test(locationURL) && originOK
  545.         ;
  546.         
  547.         if (!locationOK && locationSite && this.ignorePorts && /:\d+$/.test(locationSite)) {
  548.           if (this.isJSEnabled(locationSite.replace(/:\d+$/, ''))) {
  549.             locationOK = this.autoTemp(locationSite);
  550.           }
  551.         }
  552.         
  553.         forbid = !(locationOK && (originOK || 
  554.           !this.getPref(blockThisFrame 
  555.             ? "forbidIFramesParentTrustCheck" : "forbidActiveContentParentTrustCheck",
  556.             true)
  557.           ));
  558.       }
  559.        
  560.       if (/\binnerHTML\b/.test(new Error().stack)) {
  561.         if (this._bug453825) {
  562.           aContext.ownerDocument.location.href = 'javascript:window.__defineGetter__("top", (Window.prototype || window).__lookupGetter__("top"))';
  563.           if (this.consoleDump) this.dump("Locked window.top (bug 453825 work-around)");
  564.         }
  565.         if (this._bug472495) {
  566.           aContext.ownerDocument.defaultView.addEventListener("DOMNodeRemoved", this._domNodeRemoved, true);
  567.           if (this.consoleDump) this.dump("Added DOMNodeRemoved (bug 472495 work-around)");
  568.         }
  569.       }
  570.       
  571.       
  572.       this.delayExec(this.countObject, 0, aContext, locationSite); 
  573.       
  574.       forbid = forbid && !(/^file:\/\/\//.test(locationURL) && /^resource:/.test(originURL || (aRequestOrigin && aRequestOrigin.spec || ""))); // fire.fm work around
  575.       
  576.       if (forbid) {
  577.         try {  // moved here because of http://forums.mozillazine.org/viewtopic.php?p=3173367#3173367
  578.           if (this.getExpando(aContext, "allowed") || 
  579.             this.isAllowedObject(locationURL, mimeKey, locationSite) ||
  580.             this.isAllowedObjectById(aContext.id, locationURL, originURL, mimeKey, locationSite)
  581.             ) {
  582.             this.setExpando(aContext, "allowed", true);
  583.             return CP_OK; // forceAllow
  584.           }
  585.         } catch(ex) {
  586.           this.dump("Error checking plugin per-object permissions:" + ex);
  587.         }
  588.         
  589.         if (isLegacyFrame) { // inject an embed and defer to load
  590.           if (blockThisFrame && this.blockLegacyFrame(aContext, aContentLocation, true))
  591.             return this.reject("Deferred Legacy Frame " + locationURL, arguments);
  592.         } else {
  593.           try {
  594.             if ((aContentType == 5 || aContentType == 7 || aContentType == 12 || aContentType == 14 || aContentType == 15) && (aContext instanceof CI.nsIDOMNode)) {
  595.               if (locationURL != "data:application/x-noscript-blocked,") {
  596.                 if (this.consoleDump & LOG_CONTENT_BLOCK)
  597.                   this.dump("tagForReplacement");
  598.  
  599.                 this.delayExec(this.tagForReplacement, 0, aContext, {
  600.                   url: locationURL,
  601.                   mime: mimeKey
  602.                 });
  603.               }
  604.             } else if (this.consoleDump & LOG_CONTENT_BLOCK) this.dump("Context is not a DOMNode? " + aContentType);
  605.           } catch(ex) {
  606.             if(this.consoleDump) this.dump(ex);
  607.           } finally {
  608.             return this.reject("Forbidden " + (contentDocument ? ("IFrame " + contentDocument.URL) : "Content"), arguments);
  609.           }
  610.         }
  611.       } else {
  612.         
  613.   
  614.         if (isSilverlight) {
  615.           this.setExpando(aContext, "silverlight", aContentType != 12);
  616.         }
  617.         if (this.consoleDump & LOG_CONTENT_CALL) {
  618.           this.dump(locationURL + " Allowed, " + new Error().stack);
  619.         }
  620.       }
  621.     } catch(e) {
  622.       return this.reject("Content (Fatal Error, " + e  + " - " + e.stack + ")", arguments);
  623.     } finally {
  624.       
  625.       if (!aInternalCall) PolicyState.removeCheck(aContentLocation);
  626.       
  627.       if (isHTTP) PolicyState.save(unwrappedLocation, arguments);
  628.       else PolicyState.reset();
  629.       
  630.       
  631.       
  632.     }
  633.     return CP_OK;
  634.   },
  635.   
  636.   
  637.   shouldProcess: function(aContentType, aContentLocation, aRequestOrigin, aContext, aMimeType, aExtra) {
  638.     return this.shouldLoad(aContentType, aContentLocation, aRequestOrigin, aContext, aMimeType, CP_SHOULDPROCESS);
  639.   },
  640.   check: function() {
  641.     return false;
  642.   }
  643. }
  644.  
  645. var PolicyUtil = {
  646.   isXSL: function(ctx) {
  647.     return ctx && !(ctx instanceof CI.nsIDOMHTMLLinkElement || ctx instanceof CI.nsIDOMHTMLStyleElement);
  648.   }
  649. }